今天先從音量儀表 (Audio Metering) 組件開始做起。為了方便模組化以及開發上比較順手,之後會用 React 來寫,核心功能的程式碼會另外提的,別太擔心。
Arrangement View Mixer
這一區都屬於 Mixer (調整音量、相位、mute、solo ... 的地方),今天做的是那兩條綠綠的 bar,音量儀表 (Audio Meter),用來顯示當前的音量大小。
在 Live 內其實有分兩種編輯介面:Arrangement View 與 Session View,前者適合編輯 Audio、MIDI 片段(Clip),後者較適合操作 Loop。Session View 的 Mixer 長得像這樣:
仔細分析它的行為,小小一條 meter 會顯示幾種資訊:
先來切版吧!
原先想直接用 bootstrap 提供的 progress class 再 ratate 90 度,但發現轉了角度以後,DOM 物件實際佔有的空間不會改變:仍然是橫的,這樣對於組件來說很難使用,所以就自己切了。
props 部分有設計一些可帶入的值調整外觀
Meter.defaultProps = {
options: {
range: [-90, 6],
warnThreshold: 0,
mainHeight: "200px",
perWidth: "8px"
},
rms: {
left: 0,
right: -24
},
peak: {
left: 3,
right: -18
}
};
其中會透過一個 function 將 RMS、Peak 數值根據刻度換算後,得出百分比應用到 CSS 中。
// 超過轉紅的
const isOverLoud = (value, options) => value >= options.warnThreshold;
// 數值 -> 刻度換算 -> 百分比,目前只有 數值 -> 百分比
const convertToPercent = (value, options) => {
// TODO: 計算正確的刻度
const min = options.range[0];
const max = options.range[1];
const ratio = 100 / (max - min);
if (value >= max) return 100;
if (value <= min) return 0;
return (value - min) * ratio;
};
這部分其實是最難的。
在音樂產業中,音量儀表的刻度系統差異很大,根據國家、產業 (流行音樂、電影、影視)、數位/類比...等因素的不同,而有完全不同的刻度標準,連音量 dB 的單位會根據不同領域、不同電壓計算公式,衍生出 dBFS、dBu、dBA、dBV .... 等。有興趣可以參考這張不同刻度系統的比較圖。這邊只好先簡單用線性百分比呈現了...
今天先這樣了~